package com.gccloud.design.service;


import com.gccloud.design.dto.*;
import com.gccloud.design.entity.*;
import com.gccloud.design.vo.SdApiDefineVo;

import java.util.List;
import java.util.Map;

/**
 * @author wu.yumin
 * @version 1.0.0
 * APi定义service
 * @date 2021/6/10 21:04
 */
public interface SdApiDefineService {

    /**
     * 新增
     *
     * @param entity API定义实体
     * @return true/false
     */
    boolean insertApiDefine(SdApiDefineEntity entity);

    /**
     * 删除API定义实体
     *
     * @param apiId API定义标识
     * @return true/false
     */
    boolean delApiDefine(Long apiId);

    /**
     * 修改API定义
     *
     * @param entity API定义实体
     * @return true/false
     */
    boolean updateApiDefine(SdApiDefineEntity entity);

    /**
     * 条件分页查询 API定义
     *
     * @param sdApiDefineDto api定义dto
     * @return PageVO<SdApiDefineEntity>
     */
    Map<String, Object> selectApiDefine(SdApiDefineDto sdApiDefineDto);

    /**
     * 删除API定义
     *
     * @param apiId api标识
     * @return boolean
     */
    boolean deleteApiDefine(Integer[] apiId);

    /**
     * 新增或修改 API定义
     *
     * @param dto api定义新增或修改dto
     * @return boolean
     */
    boolean addOrUpApiDefine(SdApiAddDto dto);

    /**
     * 检查API编码是否重复
     *
     * @param apiCode api编码
     * @param apiId   api标识
     * @return boolean
     */
    boolean checkApiCodeRepeat(String apiCode, Integer apiId);

    /**
     * 基于apiId 查询能力绑定信息
     *
     * @param apiId api标识
     * @return SdApiAbilityBindEntity
     */
    SdApiAbilityBindEntity queryAbility(Integer apiId);

    /**
     * 查询调用机制、安全策略、异常处理机制、补偿机制
     *
     * @param apiId api标识
     * @return Map<String, Object>
     */
    Map<String, Object> selectPolicyList(Integer apiId);

    /**
     * 新增或修改调用机制、安全策略、异常处理机制、补偿机制
     *
     * @param policyMap policyMap
     * @return int
     */
    int insertOrUpdatePolicy(Map<String, PolicyListDto> policyMap);

    /**
     * 删除调用机制、安全策略、异常处理机制、补偿机制
     *
     * @param policyMap policyMap
     * @return int
     */
    int deletePolicy(Map<String, PolicyListDto> policyMap);

    /**
     * 查询补偿API
     *
     * @param apiId api标识
     * @return List<SdApiDefineEntity>
     */
    List<SdApiDefineEntity> selectCompApiId(Integer apiId);

    /**
     * 参数配置
     *
     * @param entity 参数配置entity
     * @return int
     */
    int paramConfig(SdApiParamEntity entity);

    /**
     * 参数配置--模拟测试
     *
     * @param entity 参数配置
     * @return Map<String, Object>
     */
    String paramConfigTest(ApiTestDto entity);


    /**
     * 保存入参
     *
     * @param entity 参数配置
     * @return Boolean
     */
    Boolean saveInparam(SdApiParamEntity entity);

    /**
     * 基于apiId 查询参数配置
     *
     * @param apiId api标识
     * @return SdApiParamEntity
     */
    SdApiParamEntity queryParamConfig(Integer apiId);

    /**
     * 查询障碍原因树
     *
     * @return List<DICReasonEntity>
     */
    List<DICReasonEntity> queryDicReason();

    /**
     * 基于apiId 查询API环节绑定信息
     *
     * @param apiId api标识
     * @return SdApiFlowRepoBindDto
     */
    SdApiFlowRepoBindDto queryApiRepoInfo(Integer apiId);

    /**
     * API定义生成环节
     *
     * @param dto 环节流程dto
     * @return boolean
     */
    boolean apiRepoBind(SdApiFlowRepoBindDto dto);

    /**
     * API定义生成环节修改
     *
     * @param dto 环节流程dto
     * @return boolean
     */
    boolean updateApiRepoBind(SdApiFlowRepoBindDto dto);

    /**
     * 删除环节
     *
     * @param bwpId 环节定义id
     * @return boolean
     */
    boolean deleteRepoBindByBwpId(String bwpId);

    /**
     * API定义 发布功能
     *
     * @param apiId   api标识
     * @param apiCode API编码
     * @param optCode 操作编码
     * @return boolean
     */
    boolean publishApi(String apiId, String apiCode, String optCode);

    /**
     * 基于api标识查询流程定义标识
     *
     * @param apiId api标识
     * @return List<SdApiAbilityBindEntity>
     */
    List<SdApiFlowRepoBindEntity> queryBwpRepoIdByApiId(Integer[] apiId);

    /**
     * 调用别人的
     *
     * @param json 入参
     * @return String 出参
     */
    String callOtherApi(SdApiCallInterface json);

    /**
     * 掉用我们的
     *
     * @param json 入参脚本
     * @return String
     */
    String callOurApi(SdApiCallInterface json);

    /**
     * 根据apiCode查询api相关信息
     *
     * @param apiCode api编码
     * @return API定义实体
     */
    SdApiDefineVo getApIByApiCode(String apiCode);

    /**
     * 根据apiCode查询api版本信息
     *
     * @param apiCode API编码
     * @return API定义实体列表
     */
    List<SdApiDefineVo> getApIVersionByApiCode(String apiCode);
}
